package webPages;

import modelo.Empleado;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
import org.apache.wicket.behavior.Behavior;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.PropertyListView;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.util.convert.IConverter;
import org.joda.time.LocalDate;
import org.uqbar.commons.model.UserException;

import database.Tienda;
import utils.LocalDateConverter;
import utils.LocalDateTextField;
import utils.TransformerBoolToSiNoString;
import applicationModels.AgregarExcepcion;
import applicationModels.ListadoExcepciones;
import applicationModels.TuplaEmpleadoExcepcion;

public class ListadoExcepcionesPage extends BasePage {

	private static final long serialVersionUID = 1L;
	private ListadoExcepciones listado; 
	private AgregarExcepcion nuevaExcepcion;
	private Button nuevaRestriccion;
	private Button nuevaLibertad;
	
	public ListadoExcepcionesPage(){
		createListadoExcepcionesForm();
		createAgregarExcepcionForm();
	}

	private void createListadoExcepcionesForm(){
		listado=new ListadoExcepciones();
		Form<ListadoExcepciones> listadoExcepcionesForm = new Form<ListadoExcepciones>("listadoExcepcionesForm", new CompoundPropertyModel<ListadoExcepciones>(listado));
		agregarCamposBusqueda(listadoExcepcionesForm);
		agregarAccionesBusqueda(listadoExcepcionesForm);
		agregarGrillaResultados(listadoExcepcionesForm);
		add(listadoExcepcionesForm);
		listado.setFechaCriterio(new LocalDate());	//para que arranque mostrando a partir de hoy
		buscarExcepciones();
	}
	

	private void agregarCamposBusqueda(Form<ListadoExcepciones> form) {
		form.add(new LocalDateTextField("fechaCriterio",form.getModelObject(),"fechaCriterio"));
	}
	
	private void agregarAccionesBusqueda(Form<ListadoExcepciones> form) {
		form.add(new Button("buscar") {
			private static final long serialVersionUID = 1L;

			@Override
			public void onSubmit() {
				ListadoExcepcionesPage.this.listado.buscar();
			}
		});
	}
	
	private void agregarGrillaResultados(Form<ListadoExcepciones> form) {
		form.add(new PropertyListView<TuplaEmpleadoExcepcion>("resultados") {
			private static final long serialVersionUID = 1L;

			@Override
			protected void populateItem(final ListItem<TuplaEmpleadoExcepcion> item) {
				item.add(new Label("empleado.legajo"));
				item.add(new Label("empleado.nombre"));
				item.add(new Label("empleado.apellido"));
				item.add(new Label("excepcion.fecha"));
				item.add(new Label("excepcion.puedeTrabajar",new TransformerBoolToSiNoString(item.getModel())));
				item.add(new Button("eliminar") {
					private static final long serialVersionUID = 1L;

					@Override
					public void onSubmit() {
						ListadoExcepcionesPage.this.listado.setExcepcionSeleccionada(item.getModelObject());
						ListadoExcepcionesPage.this.listado.quitarExcepcion();
					}
				});
			}
		});
	}

	private void buscarExcepciones() {
		listado.buscar();
	}
	
	private void createAgregarExcepcionForm(){
		nuevaExcepcion=new AgregarExcepcion();
		Form<AgregarExcepcion> nuevaExcepcionForm=new Form<AgregarExcepcion>("nuevaExcepcionForm",new CompoundPropertyModel<AgregarExcepcion>(nuevaExcepcion));
		agregarCamposNuevaExcepcion(nuevaExcepcionForm);
		agregarAccionesNuevaExcepcion(nuevaExcepcionForm);
		add(nuevaExcepcionForm);
	}

	private void agregarCamposNuevaExcepcion(Form<AgregarExcepcion> form) {
		form.add(new LocalDateTextField("fechaExcepcion",form.getModelObject(), "fechaExcepcion"));
		DropDownChoice<Empleado> empleadoDropDown = new DropDownChoice<Empleado>("empleadoElegido", Tienda.getInstance().getEmpleados(), new ChoiceRenderer<Empleado>(){
			private static final long serialVersionUID = 1L;

			@Override
			public Object getDisplayValue(Empleado object) {
				return object.getIdentificacionCompleta();
			}
		});
		empleadoDropDown.add(new OnChangeAjaxBehavior(){
			@Override
			protected void onUpdate(AjaxRequestTarget target) {
				target.add(nuevaRestriccion);
				target.add(nuevaLibertad);
			}
		});
		form.add(empleadoDropDown);
		form.add(new TextField<String>("razon", new PropertyModel<String>(form.getModelObject(), "descripcion")));
	}
	
	private void agregarAccionesNuevaExcepcion(Form<AgregarExcepcion> form) {
		nuevaRestriccion = new Button("nuevaRestriccion") {
			private static final long serialVersionUID = 1L;

			@Override
			public void onSubmit() {
				try{
					ListadoExcepcionesPage.this.nuevaExcepcion.agregarRestriccion();
					ListadoExcepcionesPage.this.buscarExcepciones();
				}catch(UserException e){
					info(e.getMessage());
				}
			}
		};
		nuevaRestriccion.add(new Behavior() {
			@Override
			public void onConfigure(Component component) {
				component.setEnabled(nuevaExcepcion.getEmpleadoElegido() != null);
			}
		});
		
		form.add(nuevaRestriccion);
		nuevaLibertad=new Button("nuevaLibertad") {
			private static final long serialVersionUID = 1L;

			@Override
			public void onSubmit() {
				try{
					ListadoExcepcionesPage.this.nuevaExcepcion.agregarLibertad();
					ListadoExcepcionesPage.this.buscarExcepciones();
				}catch(UserException e){
					info(e.getMessage());
				}
			}
		};
		nuevaLibertad.add(new Behavior() {
			@Override
			public void onConfigure(Component component) {
				component.setEnabled(nuevaExcepcion.getEmpleadoElegido() != null);
			}
		});
		form.add(nuevaLibertad);
	}

}
